package recursion;

/**
 * 递归迷宫问题
 */
public class MiGong {
    public static void main(String[] args) {
        //先创建一个二维数组，模拟迷宫
        //地图
        int[][] map = new int[8][7];
        //使用1表示墙
        //先把上下全部置为一
        for(int i = 0 ; i<7 ; i++){
            map[0][i] = 1;
            map[7][i] = 1;
        }
        //左右全部置为一
        for(int i = 0; i<8 ; i++){
            map[i][0] = 1;
            map[i][6] = 1;
        }

        //设置挡板
        map[3][1] = 1;
        map[3][2] = 1;
        map[3][3] = 1;

        //输出地图
        System.out.println("迷宫地图为：\n");
        for(int i =0 ; i<8 ; i++){
            for(int j = 0 ; j<7 ; j++){
                System.out.printf(map[i][j] + "   ");
            }
            System.out.println("\n");
        }

        //测试迷宫
        setWay(map,1,1);
        //输出新的地图
        System.out.println("走过地图为：\n");
        for(int i =0 ; i<8 ; i++){
            for(int j = 0 ; j<7 ; j++){
                System.out.printf(map[i][j] + "   ");
            }
            System.out.println("\n");
        }
    }

    //使用递归来找路
    //当map[i][j]=0表示当前路没有走过
    //为1表示墙，不能走
    //为2表示通路，可以走
    //为3表示该位置走过，而且走不通
    //定制一个策略（默认：下->右->上->左）

    /**
     *
     * @param map  表示二维数组地图
     * @param i  从那个位置开始找
     * @param j
     * @return
     */
    public static boolean setWay(int[][] map, int i, int j){

        if(map[6][5]==2){//说明通路已经找到
            return true;
        }else{
            if(map[i][j]==0){  //如果当前这个节点没有走过
                //默认策略走
                map[i][j] = 2; //假定这个点能够走通的。
                if(setWay(map,i+1,j)){  //向下走
                    return true;
                }else if(setWay(map,i,j+1)){ //向右走
                    return true;
                }else if(setWay(map,i-1,j)){ //向上走
                    return true;
                }else if(setWay(map,i,j-1)){ //向左走
                    return true;
                }else {
                    //说明该点是走不通的，是死路
                    map[i][j] = 3;
                    return false;
                }
            }else{ //map可能是1 ，2， 3
                return false;
            }
        }
    }
}
